/*
 * HeapTable.h
 *
 *  Created on: 2011-7-7
 *      Author: Donghan
 */

#ifndef HEAPTABLE_H_
#define HEAPTABLE_H_
#include "../ReferenceTable.h"

typedef ReferenceTable HeapRefTable;
typedef struct LargeHeapRefTable LargeHeapRefTable;
typedef struct HeapSource HeapSource;

struct LargeHeapRefTable {
    LargeHeapRefTable *next;
    HeapRefTable refs;
};

bool dvmHeapInitHeapRefTable(HeapRefTable *refs, size_t nelems);
void dvmHeapFreeHeapRefTable(HeapRefTable *refs);
void dvmHeapFreeLargeTable(LargeHeapRefTable *table);
void dvmHeapHeapTableFree(void *ptr);
bool dvmHeapAddRefToLargeTable(LargeHeapRefTable **tableP, Object *ref);
void dvmHeapMarkLargeTableRefs(LargeHeapRefTable *table, bool stripLowBits);
bool dvmHeapAddTableToLargeTable(LargeHeapRefTable **tableP,
        HeapRefTable *refs);
Object *dvmHeapGetNextObjectFromLargeTable(LargeHeapRefTable **pTable);

#define dvmHeapAddToHeapRefTable(refs, ptr) \
            dvmAddToReferenceTable((refs), (ptr))

#define dvmHeapNumHeapRefTableEntries(refs) \
    ({ \
        const HeapRefTable *NHRTE_refs = (refs); \
        dvmReferenceTableEntries(refs); \
    })

#define dvmHeapRemoveFromHeapRefTable(refs, ptr) \
            dvmRemoveFromReferenceTable((refs), (refs)->table, (ptr))


#endif /* HEAPTABLE_H_ */
